<?php

/**
 * Сообщение.
 *
 */
class Kernel_Response_Message {

    /**
     * Наименование переменной сессии, в которой хранятся данные сообщения.
     *
     */
    const SESSION_VAR = 'RESPONSE_MESSAGE';

    /**
     * Статус сообщения (TRUE — уведомление, FALSE — ошибка).
     *
     * @var boolean
     */
    private $_status = true;

    /**
     * Содержимое сообщения.
     *
     * @var string
     */
    private $_contents = '';

    /**
     * Конструктор.
     *
     * @param   boolean $status
     * @param   mixed   $contents
     */
    public function __construct($status, $contents) {
        if (is_array($contents)) {
            list($class, $action) = $contents;
            $contents = self::compose($class, $action);
        }
        $this->_status = $status;
        $this->_contents = $contents;
    }

    /**
     * Сохраняет сообщение в сессии.
     *
     */
    public function store() {
        $_SESSION[self::SESSION_VAR] = $this;
    }

    /**
     * Сохраняет сообщение в сессии.
     *
     */
    public function display() {
        Application::getResponse()->assign('message', $this->_toArray());
    }

    static public function compose($class, $action) {
        $class = strtoupper($class);
        $action = strtoupper($action);
        $custom = $class . '_' . $action;
        return Kernel_i18n::exists($custom) ? __($custom) : __('MESSAGE_' . $action);
    }

    /**
     * Возвращает последнее сохраненное сообщение.
     *
     * @return  array
     */
    static public function get() {
        $var = self::SESSION_VAR;
        $message = isset($_SESSION[$var]) && $_SESSION[$var] instanceof self
            ? $_SESSION[$var]->_toArray() : null;
        unset($_SESSION[$var]);
        return $message;
    }

    /**
     * Возвращает представление сообщения в виде массива.
     *
     * @return  array
     */
    private function _toArray() {
        return array(
            'status' => $this->_status,
            'contents' => $this->_contents,
        );
    }
}
